package br.com.pucrs.trabalho1.estrutura;

public class GeradorPseudoRandomico {

	public static final Double ModuloDefault = 10000.0;

	public static final long MultiplicadorDefault = 62597;

	public static final long SomadorDefault = 431;

	private long mutiplicador;

	private long incremento;

	private Intervalo interalo;

	private long media;

	private Double semente;

	private Double modulo;
		
	public GeradorPseudoRandomico(Intervalo intervalo, Double semente) {
		this.modulo = ModuloDefault;
		this.mutiplicador = MultiplicadorDefault;
		this.incremento = SomadorDefault;
		this.semente = semente;
		this.interalo = intervalo;
		this.media = 0;
	}

	public Double geraPseudoRandomicoUniforme() {
		this.semente = ((this.mutiplicador * this.semente) + this.incremento)
				% this.modulo;
		return this.semente;
	}

	public Double geraPseudoRandomicoUniformeEntreZeroUm() {
		return new Double(this.geraPseudoRandomicoUniforme() / (this.modulo - 1));
	}

	public Double geraPseudoRandomicoUniformeEntreIntervalo() {
		return this.interalo.getInicio()
				+ (this.geraPseudoRandomicoUniformeEntreZeroUm() * (this.interalo.getFim() - this.interalo.getInicio()));
	}
	
	public Double geraPseudoRandomicoUniformeEntreIntervalo(double x) {
		return this.interalo.getInicio()
				+ (x * (this.interalo.getFim() - this.interalo.getInicio()));
	}

	public Double geraPseudoRandomicoExponencial() {
		return (this.media * (-1))
				* Math.log(this.geraPseudoRandomicoUniformeEntreZeroUm());
	}

	public long getIncremento() {
		return incremento;
	}

	public void setIncremento(long incremento) {
		this.incremento = incremento;
	}

	public Intervalo getInteralo() {
		return interalo;
	}

	public void setInteralo(Intervalo interalo) {
		this.interalo = interalo;
	}

	public long getMedia() {
		return media;
	}

	public void setMedia(long media) {
		this.media = media;
	}

	public Double getModulo() {
		return modulo;
	}

	public void setModulo(Double modulo) {
		this.modulo = modulo;
	}

	public long getMutiplicador() {
		return mutiplicador;
	}

	public void setMutiplicador(long mutiplicador) {
		this.mutiplicador = mutiplicador;
	}

	public Double getSemente() {
		return semente;
	}

	public void setSemente(Double semente) {
		this.semente = semente;
	}



}
